+2006-03-07 Federico Mena Quintero <federico@novell.com>
+
+ Cancel drags when the grabs get broken. Fixes bug #333056:
+
+ * gtk/gtkdnd.c (gtk_drag_selection_received): The time argument is
+ a guint, not guint32.
+ (gtk_drag_source_event_cb): Return gboolean, not gint.
+ (gtk_drag_anim_timeout): Likewise.
+ (gtk_drag_motion_cb): Likewise.
+ (gtk_drag_key_cb): Likewise.
+ (gtk_drag_button_release_cb): Likewise.
+ (gtk_drag_abort_timeout): Likewise.
+ (gtk_drag_begin_internal): Connect to "grab-broken-event" on the
+ ipc_widget.
+ (gtk_drag_source_info_destroy): Disconnect from the
+ "grab-broken-event" callback.
+ (gtk_drag_end): Likewise.
+ (gtk_drag_grab_broken_event_cb): New callback. We cancel the drag
+ if the grab was broken and not regrabbed by the DnD code.
+
+2006-03-07 Federico Mena Quintero <federico@novell.com>
+
+ * gtk/gtkfilechooserdefault.c (shortcuts_button_press_event_cb):
+ Hack to let the treeview's button-press-event handler run before
+ ours. This lets the selection be updated before we pop up a
+ context menu.
+
Tue Mar 7 17:16:34 2006 Tim Janik <timj@gtk.org>
* configure.in: depend on glib-2.10.1.
+2006-03-07 Federico Mena Quintero <federico@novell.com>
+
+ Cancel drags when the grabs get broken. Fixes bug #333056:
+
+ * gtk/gtkdnd.c (gtk_drag_selection_received): The time argument is
+ a guint, not guint32.
+ (gtk_drag_source_event_cb): Return gboolean, not gint.
+ (gtk_drag_anim_timeout): Likewise.
+ (gtk_drag_motion_cb): Likewise.
+ (gtk_drag_key_cb): Likewise.
+ (gtk_drag_button_release_cb): Likewise.
+ (gtk_drag_abort_timeout): Likewise.
+ (gtk_drag_begin_internal): Connect to "grab-broken-event" on the
+ ipc_widget.
+ (gtk_drag_source_info_destroy): Disconnect from the
+ "grab-broken-event" callback.
+ (gtk_drag_end): Likewise.
+ (gtk_drag_grab_broken_event_cb): New callback. We cancel the drag
+ if the grab was broken and not regrabbed by the DnD code.
+
+2006-03-07 Federico Mena Quintero <federico@novell.com>
+
+ * gtk/gtkfilechooserdefault.c (shortcuts_button_press_event_cb):
+ Hack to let the treeview's button-press-event handler run before
+ ours. This lets the selection be updated before we pop up a
+ context menu.
+
Tue Mar 7 17:16:34 2006 Tim Janik <timj@gtk.org>
* configure.in: depend on glib-2.10.1.
static void gtk_drag_selection_received (GtkWidget *widget,
GtkSelectionData *selection_data,
- guint32 time,
+ guint time,
gpointer data);
static void gtk_drag_find_widget (GtkWidget *widget,
GtkDragFindData *data);
static void gtk_drag_cancel (GtkDragSourceInfo *info,
guint32 time);
-static gint gtk_drag_source_event_cb (GtkWidget *widget,
+static gboolean gtk_drag_source_event_cb (GtkWidget *widget,
GdkEvent *event,
gpointer data);
static void gtk_drag_source_site_destroy (gpointer data);
guint sel_info,
guint32 time,
gpointer data);
-static gint gtk_drag_anim_timeout (gpointer data);
+static gboolean gtk_drag_anim_timeout (gpointer data);
static void gtk_drag_remove_icon (GtkDragSourceInfo *info);
static void gtk_drag_source_info_destroy (GtkDragSourceInfo *info);
static void gtk_drag_add_update_idle (GtkDragSourceInfo *info);
gint x_root,
gint y_root,
GdkEvent *event);
-static gint gtk_drag_motion_cb (GtkWidget *widget,
+static gboolean gtk_drag_motion_cb (GtkWidget *widget,
GdkEventMotion *event,
gpointer data);
-static gint gtk_drag_key_cb (GtkWidget *widget,
+static gboolean gtk_drag_key_cb (GtkWidget *widget,
GdkEventKey *event,
gpointer data);
-static gint gtk_drag_button_release_cb (GtkWidget *widget,
+static gboolean gtk_drag_grab_broken_event_cb (GtkWidget *widget,
+ GdkEventGrabBroken *event,
+ gpointer data);
+static gboolean gtk_drag_button_release_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer data);
-static gint gtk_drag_abort_timeout (gpointer data);
+static gboolean gtk_drag_abort_timeout (gpointer data);
/************************
* Cursor and Icon data *
static void
gtk_drag_selection_received (GtkWidget *widget,
GtkSelectionData *selection_data,
- guint32 time,
+ guint time,
gpointer data)
{
GdkDragContext *context;
info->start_x = info->cur_x;
info->start_y = info->cur_y;
+ g_signal_connect (info->ipc_widget, "grab-broken-event",
+ G_CALLBACK (gtk_drag_grab_broken_event_cb), info);
g_signal_connect (info->ipc_widget, "button_release_event",
G_CALLBACK (gtk_drag_button_release_cb), info);
g_signal_connect (info->ipc_widget, "motion_notify_event",
* Source side callbacks.
*/
-static gint
+static gboolean
gtk_drag_source_event_cb (GtkWidget *widget,
GdkEvent *event,
gpointer data)
}
}
-static gint
+static gboolean
gtk_drag_anim_timeout (gpointer data)
{
GtkDragAnim *anim = data;
g_object_unref (info->widget);
+ g_signal_handlers_disconnect_by_func (info->ipc_widget,
+ gtk_drag_grab_broken_event_cb,
+ info);
g_signal_handlers_disconnect_by_func (info->ipc_widget,
gtk_drag_button_release_cb,
info);
gdk_display_keyboard_ungrab (display, time);
gtk_grab_remove (info->ipc_widget);
+ g_signal_handlers_disconnect_by_func (info->ipc_widget,
+ gtk_drag_grab_broken_event_cb,
+ info);
g_signal_handlers_disconnect_by_func (info->ipc_widget,
gtk_drag_button_release_cb,
info);
* results:
*************************************************************/
-static gint
+static gboolean
gtk_drag_motion_cb (GtkWidget *widget,
GdkEventMotion *event,
gpointer data)
#define BIG_STEP 20
#define SMALL_STEP 1
-static gint
+static gboolean
gtk_drag_key_cb (GtkWidget *widget,
GdkEventKey *event,
gpointer data)
return TRUE;
}
+static gboolean
+gtk_drag_grab_broken_event_cb (GtkWidget *widget,
+ GdkEventGrabBroken *event,
+ gpointer data)
+{
+ GtkDragSourceInfo *info = (GtkDragSourceInfo *)data;
+
+ /* Don't cancel if we break the implicit grab from the initial button_press.
+ * Also, don't cancel if we re-grab on the widget or on our IPC window, for
+ * example, when changing the drag cursor.
+ */
+ if (event->implicit
+ || event->grab_window == info->widget->window
+ || event->grab_window == info->ipc_widget->window)
+ return FALSE;
+
+ gtk_drag_cancel (info, gtk_get_current_event_time ());
+ return TRUE;
+}
+
/*************************************************************
* gtk_drag_button_release_cb:
* "button_release_event" callback during drag.
* results:
*************************************************************/
-static gint
+static gboolean
gtk_drag_button_release_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
return TRUE;
}
-static gint
+static gboolean
gtk_drag_abort_timeout (gpointer data)
{
GtkDragSourceInfo *info = data;